#ifndef _CQLPARSER_H
#define _CQLPARSER_H

#include<stdint.h>

typedef enum{
  /* terminal */
    NT_INT,
    NT_FLOAT,
    NT_STRING,
    NT_BOOL,
    NT_AND,
    NT_OR,
    NT_XOR,
    NT_COMPARISON,

  /* non terminal 
  *  只定义了顶端的节点类型，分支的树节点类型一律使用NT_NODE
  *  因为ParseNode节点匿名的特性，使得其内部分支节点具有一个约定
  *  则只知道顶端节点就可依据下标判断其分支节点
  */
    NT_NODE,
    NT_EDGE,
    NT_CREATE,
    NT_MATCH,
    NT_WHERE,
    NT_RETURN,
    NT_SET,
    NT_DELETE,
    NT_REMOVE
}NodeType;

typedef struct _ParseNode
{
  NodeType   type_;
 
  /* 终止符节点的真实的值 */
  union{
    int64_t      int_num;
    double       float_num;
    char*  str_value;
  }value;
 
  /* 非终止符节点的孩子节点*/
  int32_t      num_child; /*孩子节点的个数*/
  struct _ParseNode** children; 
 
  // BuildPlanFunc m_fnBuildPlan;
} ParseNode;

ParseNode* new_non_terminal_node(NodeType type, int num, ...);
ParseNode* new_int_terminal_node(NodeType type, int num);
ParseNode* new_float_terminal_node(NodeType type, double num);
ParseNode* new_string_terminal_node(NodeType type, char* str);
void non_terminal_add_child(ParseNode* node, int num);

ParseNode* getParseTree(ParseNode* node);
ParseNode* traveNode(ParseNode* node);
#endif